package leetcode.primary;

public class T31 {
    int len;
    public void nextPermutation(int[] nums) {
        len = nums.length;
        int X = find_reverse_order(nums);
        System.out.println(X);
        if(X!=-1){
            int Y = find_larger(nums,X);
            System.out.println(Y);
            int temp = nums[Y];
            nums[Y] = nums[X];
            nums[X] = temp;
            sort(nums,X+1,len-1);
        }else{
            sort(nums,0,len-1);
        }
        for(int i=0;i<len;i++){
            System.out.print(nums[i]);
        }
    }
    public int find_reverse_order(int[] nums){
        for(int i= len-1;i>=1;i--){
            if(nums[i-1]<nums[i]){
                return i-1;
            }
        }
        return -1;
    }

    public int find_larger(int[]nums,int X){
        for(int i = len-1;i>=0;i--){
            if(nums[i]>nums[X]){
                return i;
            }
        }
        return X+1;
    }
    public void sort(int[] nums,int left,int right){
        if(left>right){
            return;
        }
        int i =left,j = right;
        int temp=0;
        int key = nums[left];
        while(i!=j){
            while(nums[j]>=key && i<j){
                j--;
            }
            while(nums[i]<=key && i<j){
                i++;
            }
            if(i<j){
                temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
        nums[left] = nums[i];
        nums[i] = key;
        sort(nums,left,i-1);
        sort(nums,i+1,right);
    }

    public static void main(String[] args) {
        T31 cc = new T31();
        cc.nextPermutation(new int[]{1,2,4,6,5,3});
    }
}
/*
我们再来看一段文字描述：（用字典序法找124653的下一个排列）
1.如果当前排列是124653，找它的下一个排列的方法是，从这个序列中从右至左找第一个左邻小于右邻的数
2.如果找不到，则所有排列求解完成，如果找得到则说明排列未完成
3.本例中将找到46，计4所在的位置为i,找到后不能直接将46位置互换，而又要从右到左到第一个比4大的数
4.本例找到的数是5，其位置计为j，将i与j所在元素交换125643
5.然后将i+1至最后一个元素从小到大排序得到125346，这就是124653的下一个排列
*/